package com.liu.wrod.utils;

import lombok.extern.slf4j.Slf4j;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Base64;

/**
 * ChartWithChineseExample : 图表生成工具类
 *
 * @author zyw
 * @create 2024-06-25  16:20
 */

@Slf4j
@Component
public class ChartUtils {

    // 柱状图临时文件名
    public final static String BAR_CHART_FILE_NAME = "BAR_CHART.png";
    // 饼图临时文件名
    public final static String PIE_CHART_FILE_NAME = "PIE_CHART.png";
    // 折线图临时文件名
    public final static String LINE_CHART_FILE_NAME = "LINE_CHART.png";
    /**
     * 注册中文字体
     */
    public static void registerChineseFont() {
        // 注册中文字体（这里假设已经将字体文件放置在项目的resources目录下）
        InputStream fontStream = ChartUtils.class.getResourceAsStream("/template/SimSun.ttf"); // 路径根据实际情况调整
        try {
            Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(Font.PLAIN, 12);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(customFont);
        } catch (FontFormatException | IOException e) {
            e.printStackTrace();
        }
    }

    public static InputStream lineChartGeneration(String title, String x, String y, DefaultCategoryDataset dataset) {
        registerChineseFont();

        JFreeChart chart = ChartFactory.createLineChart(
                title,      // 图表标题
                x,          // X轴标签
                y,          // Y轴标签
                dataset,    // 数据集
                PlotOrientation.VERTICAL, // 图表方向
                true,   // 是否显示图例
                true,   // 是否生成工具提示
                false      // 是否生成URL链接
        );
        chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 18));
        chart.getLegend().setItemFont(new Font("SimSun", Font.PLAIN, 14));
        // 示例字体为宋体，常规，14号
        Font axisLabelFont = new Font("SimSun", Font.PLAIN, 14);
        // X轴
        chart.getCategoryPlot().getDomainAxis().setLabelFont(axisLabelFont);
        chart.getCategoryPlot().getDomainAxis().setTickLabelFont(axisLabelFont);
        // Y轴
        chart.getCategoryPlot().getRangeAxis().setLabelFont(axisLabelFont);
        chart.getCategoryPlot().getRangeAxis().setTickLabelFont(axisLabelFont);
        try {
            // 将图表转换为字节数组
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BufferedImage chartImage = chart.createBufferedImage(400, 300); // 设置图像的宽高
            ImageIO.write(chartImage, "png", outputStream);
            byte[] chartBytes = outputStream.toByteArray();
            // 将字节数组转换为InputStream
            InputStream inputStream = new ByteArrayInputStream(chartBytes);
            return inputStream;
        } catch (IOException e) {
            log.error("折线图图生成异常");
            return null;
        }
    }

    /**
     * 饼图生成
     *
     * @param title   标题
     * @param dataset 数据集
     * @return
     */
    public static InputStream pieChartGeneration(String title, DefaultPieDataset dataset) {
        registerChineseFont();
        // 使用数据集创建饼图
        JFreeChart chart = ChartFactory.createPieChart3D(
                title, // 图表标题
                dataset, // 数据集
                true, // 是否显示图例
                true, // 是否生成工具提示
                false // 是否生成URL链接
        );
        chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 18));
        chart.getLegend().setItemFont(new Font("SimSun", Font.PLAIN, 12));
        //设置抗锯齿
        chart.setTextAntiAlias(false);
        // 获取饼图的plot对象，以便进行进一步定制
//        PiePlot3D plot = (PiePlot3D) chart.getPlot();

        PiePlot plot = (PiePlot) chart.getPlot();
        //忽略无值的分类
        plot.setIgnoreNullValues(true);
        // 设置标签字体
        plot.setLabelFont(new Font("SimSun", Font.PLAIN, 14));
        // 设置无数据信息字体（如果需要）
        plot.setNoDataMessageFont(new Font("SimSun", Font.PLAIN, 18));

        plot.setNoDataMessage("暂无数据");
        plot.setBackgroundAlpha(0f);
        //设置标签阴影颜色
        plot.setShadowPaint(new Color(255,255,255));
        //设置标签生成器(默认{0})
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}"));

        try {
            // 将图表转换为字节数组
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BufferedImage chartImage = chart.createBufferedImage(800, 600); // 设置图像的宽高
            ImageIO.write(chartImage, "png", outputStream);
            byte[] chartBytes = outputStream.toByteArray();

            // 将字节数组转换为InputStream
            return new ByteArrayInputStream(chartBytes);
        } catch (IOException e) {
            log.error("饼图生成异常");
            return null;
        }
    }



    /**
     * 创建柱状图表
     *
     * @param dataset 数据集
     * @return
     */
    public static InputStream createChartPanel(String title, String x, String y, DefaultCategoryDataset dataset) {
        registerChineseFont();
        // 创建图表
        JFreeChart chart = ChartFactory.createBarChart(
                title, // 图表标题
                x, // X轴标签
                y, // Y轴标签
                dataset,
                PlotOrientation.VERTICAL,
                true, // 是否显示图例
                true, // 是否使用工具提示
                false // 是否生成URL链接
        );

        // 设置字体
        chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 18));
        chart.getLegend().setItemFont(new Font("SimSun", Font.PLAIN, 12));
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.getDomainAxis().setLabelFont(new Font("SimSun", Font.PLAIN, 12));
        plot.getRangeAxis().setLabelFont(new Font("SimSun", Font.PLAIN, 12));
        plot.getDomainAxis().setTickLabelFont(new Font("SimSun", Font.PLAIN, 12));
        plot.getRangeAxis().setTickLabelFont(new Font("SimSun", Font.PLAIN, 12));
        try {
            // 将图表转换为字节数组
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BufferedImage chartImage = chart.createBufferedImage(400, 300); // 设置图像的宽高
            ImageIO.write(chartImage, "png", outputStream);
            byte[] chartBytes = outputStream.toByteArray();
            // 将字节数组转换为InputStream
            InputStream inputStream = new ByteArrayInputStream(chartBytes);
            return inputStream;
        } catch (IOException e) {
            log.error("柱状图生成异常");
            return null;
        }
    }





    /**
     * 将文件输入流转为base64
     */
    public static String getBase64FromInputStream(InputStream in) {
        // 将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        byte[] data = null;
        // 读取图片字节数组
        try {
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[100];
            int rc = 0;
            while ((rc = in.read(buff, 0, 100)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            data = swapStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Base64.getEncoder().encodeToString(data);
    }
}
